package com.hzz.gulimall.cart.interceptor;

import com.atguigu.common.constant.AuthServerConstant;
import com.atguigu.common.constant.CartConstant;
import com.hzz.gulimall.cart.vo.UserInfoTo;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.UUID;

/**
 * 在执行目标方法之前，判断用户的登录状态，并封装给controller目标请求
 */
@Component
public class CartInterceptor implements HandlerInterceptor {

    // 静态，线程之间互不干扰，当发起一个请求，tomcat就会创建一个线程处理
    public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>();

    //目标方法执行之前处理，处理完成在进入controller

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {

        // 准备好要设置到threadlocal里的user对象 ,to 传输对象
        UserInfoTo userInfoTo = new UserInfoTo();
        HttpSession session = request.getSession();
        // 获取loginUser对应的用户value，没有也不去登录了。登录逻辑放到别的代码里，需要登录时再重定向
        String username =(String)session.getAttribute(AuthServerConstant.LOGIN_USER);
        Long userId=null;
        if (username!=null){
            userId =Long.valueOf(session.getAttribute(AuthServerConstant.LOGIN_USERId).toString());
        }

        if (username != null){ // 用户登陆了，设置userId 不是临时用户
            userInfoTo.setUserName(username);
            userInfoTo.setUserId(userId);

        }

        // 不登录也没关系，可以访问临时用户购物车
        // 去查看请求带过来的cookies里的临时购物车cookie
        Cookie[] cookies = request.getCookies();
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie : cookies) {
                //user-key
                String name = cookie.getName();
                if(name.equals(CartConstant.TEMP_USER_COOKIE_NAME)){
                    userInfoTo.setUserKey(cookie.getValue());
                    userInfoTo.setTempUser(true);
                }
            }
        }
        // 如果没有临时用户 则分配一个临时用户 // 分配的临时用户在postHandle的时候放到cookie里即可
        if (StringUtils.isEmpty(userInfoTo.getUserKey())){
            String uuid = UUID.randomUUID().toString().replace("-","");
            userInfoTo.setUserKey("jiajiale-" + uuid);//临时用户

        }
        threadLocal.set(userInfoTo);
        return true;
        // 还有一个登录后应该删除临时购物车的逻辑没有实现
    }

    /**
     *  业务执行以后
     * 执行完毕之后分配临时用户让浏览器保存
     */
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {

        UserInfoTo userInfoTo = threadLocal.get();
        // 如果是临时用户，返回临时购物车的cookie
        if(!userInfoTo.isTempUser()){
            Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, userInfoTo.getUserKey());
            // 设置这个cookie作用域 过期时间
            cookie.setDomain("jiajialemall.com");
            cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_TIME_OUT);
            response.addCookie(cookie);
        }
    }
}


